#include "LiteApp.h"

//  NET模块
static u8 LiteCmd_Net(u8 *Line)
{
  //  step1：保护
  if(Line==NULL) return 0;
  
  return 1;
}
//  透传AT指令
static u8 LiteCmd_AtTrans(u8 *Line)
{
  //  step1：保护
  if(Line==NULL) return 0;
  
  //  step2：获取参数字符串-不能包含空白字符
  u8 ucpAtCmd[64];        //  申请内存，大小为ESP模块最大
  memset(ucpAtCmd, 0,64); //  复位缓存区，防止脏数据
  sscanf((char *)Line,"%s" ,(char *)ucpAtCmd);  //  获取cmd参数
  strcat((char *)ucpAtCmd,"\r\n");              //  拼接“\r\n”
  //  step3：发给ESP32(二选一方式)
//  LITEAT_Write(ucpAtCmd,strlen((char *)ucpAtCmd));   //  方式一：走AT状态机
  BSP_ESP32_Send(ucpAtCmd,strlen((char *)ucpAtCmd));  //  方式二：透传给模块
  //  step4：参数打印，测试使用，查看参数是否正确
  u8 TempLogStr[128]="\r\n[ESP32] << ";
  strcat((char *)TempLogStr,(char *)ucpAtCmd);
  LITE_LOG_Send((u8 *)TempLogStr,strlen((char *)TempLogStr));
  return 1;
}

//  检测任务最高水位-数值越低越危险
static u8 LiteCmd_TaskUsageCheck(u8 *Line)
{
  //  step1：保护
  if(Line==NULL) return 0;
  u8  ucTempStr[256];
  u16 len=0;        //  总打印字符长度
  u16 templen=0;    //  单次打印字符长度
  UBaseType_t highWaterMark;
  char* taskName;
  extern TaskHandle_t xTaskHandle_Cmd;        // 任务句柄：命令
  extern TaskHandle_t xTaskHandle_Net;        // 任务句柄：网络
  extern TaskHandle_t xTaskHandle_Log;        // 任务句柄：日志
  //  step2：
  //  获取当前任务的栈高水位
  highWaterMark = uxTaskGetStackHighWaterMark(xTaskHandle_Cmd);
  //  获取当前任务的任务名
  taskName = pcTaskGetName(xTaskHandle_Cmd);
  //  打印任务名称和栈高水位信息，单位是字（通常是4字节）
  templen=UTIL_PrintfToBuf(ucTempStr,256,(const u8 *)"'%s' water mark: %lu words\r\n",taskName,highWaterMark);
  len+=templen;
  //  获取当前任务的栈高水位
  highWaterMark = uxTaskGetStackHighWaterMark(xTaskHandle_Net);
  //  获取当前任务的任务名
  taskName = pcTaskGetName(xTaskHandle_Net);
  //  打印任务名称和栈高水位信息，单位是字（通常是4字节）
  templen=UTIL_PrintfToBuf(ucTempStr+len,256,(const u8 *)"'%s' water mark: %lu words\r\n",taskName,highWaterMark);
  len+=templen;
  
  //  获取当前任务的栈高水位
  highWaterMark = uxTaskGetStackHighWaterMark(xTaskHandle_Log);
  //  获取当前任务的任务名
  taskName = pcTaskGetName(xTaskHandle_Log);
  //  打印任务名称和栈高水位信息，单位是字（通常是4字节）
  templen=UTIL_PrintfToBuf(ucTempStr+len,256,(const u8 *)"'%s' water mark: %lu words\r\n",taskName,highWaterMark);
  len+=templen;
  
  //  推入日志
  LITE_LOG_Write(ucTempStr,len);
  
  return 1;
}

//  命令盒子
const CMDTBL_T cmd_tbl[] =
{
  {"at",LiteCmd_AtTrans}, //  AT透传
  {"net",LiteCmd_Net},    //  NET模块测试
  {"taskcheck",LiteCmd_TaskUsageCheck},   //  任务水位检查
  {0,0}
};

/*
*********************************************************************************************************
* 函 数 名:   TASK_CMD
* 功能说明:   CMD任务-状态机版本
* 形    参:   
* 返 回 值:   无
*********************************************************************************************************
*/
void TASK_CMD( void *pvParameters)
{
  u8 ret;    //  返回值
  while(1)
  {
    switch(g_tLiteCmd.FsmState)
    {
      //  CMD空闲状态
      case CMD_STATE_INIT:
        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);    //Miaozi：等待任务通知
        LITE_CMD_SetState(CMD_STATE_CAPTURE);        //Miaozi：执行到这里说明任务被激活       
        break;
      // 状态机：CMD捕获状态
      case  CMD_STATE_CAPTURE:  
        ret = LITE_CMD_Capture();               //Miaozi：获取缓存区数据
        if(ret)
        {
          LITE_CMD_SetState(CMD_STATE_PARSE);    //Miaozi：CMD解析状态
        }
        else
        {
          LITE_CMD_SetState(CMD_STATE_INIT); //Miaozi:初始态   
        }
        break;
      //Miaozi：CMD解析状态
      case  CMD_STATE_PARSE:   
        ret = LITE_CMD_Parese();    //  从缓存中解析出CMD子串      
        if(ret)
        {
          LITE_CMD_SetState(CMD_STATE_MATCH);  //Miaozi：CMD配对状态 
        }
        else
        {
          LITE_CMD_SetState(CMD_STATE_INIT);   //Miaozi:初始态   
        }
        break;
      // Miaozi：CMD配对状态
      case  CMD_STATE_MATCH:
        ret = LITE_CMD_Match(cmd_tbl);   //  匹配CMD与已有命令盒子
        if(ret)
        {
          LITE_CMD_SetState(CMD_STATE_EXECUTE);  //Miaozi：CMD执行状态
        }
        else
        {
          LITE_CMD_SetState(CMD_STATE_INIT);     //Miaozi：初始态
        }
        break;
      // 状态机：CMD执行状态
      case  CMD_STATE_EXECUTE:  
        LITE_CMD_RunCommand();
//        if(ret)
//        {
          BUF_DelData(g_tLiteCmd.tpCmdBuf);           //Miaozi：清空命令缓存区数据
          LITE_CMD_SetState(CMD_STATE_INIT);           //Miaozi：初始态
//        }
        break;
      default:
        LITE_CMD_SetState(CMD_STATE_INIT);             //Miaozi：初始态
        break;
    } 
    if(g_tLiteCmd.tpTxBuf->length>0)       //Miaozi：发送区缓存不空
    {
      LITE_LOG_Write(g_tLiteCmd.tpTxBuf->data,g_tLiteCmd.tpTxBuf->length);    //Miaozi：日志写入
      BUF_Clear(g_tLiteCmd.tpTxBuf);       //Miaozi：逻辑清空发送缓存       
    }   
  }
}

/***************************** LiteBsp by Miaozi (END OF FILE) *********************************/
